package tech.aistar.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import tech.aistar.pojo.User;

import java.util.Date;

/**
 * jwt token 生成与验证（解析）
 */
public class JwtUtils {
    //盐
    private static final String SIG = "febaa5b6-b818-440a-ad8a-9606ffaafd0c";

    //设置过期时间,单位毫秒
    private static final long EXPIRE_TIME = 60 * 1000 * 60;

    /**
     * 生成token
     *
     * @param user 用户信息
     * @return token
     */
    public static String generateToken(User user) {
        //1.构建jwt对象
        //2.指定header（一般省略）
        //3.放置payload，以及过期时间和生效时间
        //4.进行数字签名
        //第一个参数是数字签名（需要自己生成）
        //第二个参数 加密的签名算法，新版需要保证一定强度（HS256至少要32字节，HS384至少需要84字节，HS512至少要64字节）
        //5.生成token
        Date now = new Date();
        String token = Jwts.builder()
                .claim("username", user.getUsername())
                .claim("id", user.getId())
                .issuedAt(now)
                .expiration(new Date(now.getTime() + EXPIRE_TIME))
                .signWith(Keys.hmacShaKeyFor(SIG.getBytes()), Jwts.SIG.HS256)
                .compact();
        return token;
    }

    /**
     * 验证token
     *
     * @param token 生成的令牌
     * @return payload中的用户信息
     */
    public static Claims verifyToken(String token) {
        //1.构建解析对象
        //2.指定数字签名
        //3.指定被签名后的token
        JwtParser parser = Jwts.parser()
                .verifyWith(Keys.hmacShaKeyFor(SIG.getBytes())).build();
        try {
            Claims payload = parser.parseSignedClaims(token).getPayload();
            return payload;
        } catch (Exception e) {
            //TODO: token 解析失败的处理
            return null;
        }
    }
}